package com.hgkj.cloud.base.scheme.table;

import com.hgkj.cloud.base.scheme.ClsAnswerRequest;
import com.hgkj.cloud.base.scheme.ClsAnswerResult;
import com.hgkj.cloud.base.scheme.ClsScore;

import java.util.Map;

/**
 * 十三、大学生心理健康调查表（Upi），共63题，最后两题要求输入内容，并用@@存储
 */
public class Table13 extends AbstractTable implements TableCalculate{
    String code = "";

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public ClsAnswerResult calc(ClsAnswerRequest answer) {
        return GetUpiFactorScore(answer);
    }

    @Override
    public String[] report(Map map) {
        return null;
    }

    // ☆十三、大学生心理健康调查表（Upi），共63题，最后两题要求输入内容，并用@@存储
    private static ClsAnswerResult GetUpiFactorScore(ClsAnswerRequest answer) {
        ClsAnswerResult result = new ClsAnswerResult();
        result.setMessage("");
        result.setType(answer.getType());
        result.setUuid(answer.getUuid());
        try {
            // 1正确题数
            int MAX_NUM = 63;

            int intI;
            // 转换回原来格式
            String strTemp = answer.getAnswer().replaceAll("\\|@", "@@");
            // 临时赋值，JAVA默认切割时为空就不增加数组长度
            String[] strAnswer_c_Temp = strTemp.split(g_sChar);
            String[] strAnswer_c = { "", "", "" };
            for (intI = 0; intI < strAnswer_c_Temp.length; intI++) {
                strAnswer_c[intI] = strAnswer_c_Temp[intI].trim();
            }

            String[] sAnswer = strAnswer_c[0].split(g_nChar);

            if (sAnswer.length != MAX_NUM) {
                result.setMessage("答案数量不符！");
                return result;
            }

            int i;
            // 答案是：1否，2是
            // 共一组，0,1
            // 不计分题：5,20,35,50,61,62,63
            // 61，62，63题目的计数器
            int intCount = 0;
            // 是否在“想要咨询问题的题号是”中有8,16,25,26
            boolean blExist = false;
            String[] strSubA;

            String[] vAppraiseA = new String[8]; // 按“总分”和选项得到“诊断结果”
            for (i = 0; i < vAppraiseA.length; i++) {
                vAppraiseA[i] = "";
            }

            int vFactor = 0; // 实际为1个因子

            // 由于“答案”中可能有特殊的内容，要进行分割
            // 正确的应该分出三份内容，第一份是答案，其他二份分别是“想要咨询问题的题号是”，“想要咨询的问题是”

            // 总分
            for (i = 0; i < sAnswer.length; i++) {
                switch (i + 1) {
                    case 5:
                    case 20:
                    case 35:
                    case 50:
                        break;
                    case 61:
                    case 62:
                    case 63:
                        if (Integer.parseInt(sAnswer[i]) == 2) {
                            intCount += 1;
                        }
                        break;
                    default:
                        if (Integer.parseInt(sAnswer[i]) == 2) {
                            vFactor += 1;
                        }
                        break;
                }
            }

            // 是否在“想要咨询问题的题号是”中有8,16,25,26
            if (strAnswer_c[1].length() > 0) {
                strSubA = strAnswer_c[1].split("□");
                if (strSubA.length <= 1) {
                    strSubA = strAnswer_c[1].split("□□"); // 这里故意这么做的，其实就是只有一个的时候直接复制一下。
                }
                for (i = 0; i < strSubA.length; i++) {
                    switch (strSubA[i]) {
                        case "8":
                        case "16":
                        case "25":
                        case "26":
                            blExist = true;
                            break;
                    }
                }
            }

            // 按“总分”和选项得到“诊断结果”
            // 条件1：总分>=25 or 题25选是 or 第61,62,63选有,多于两个（>=2）or 想咨询的题目中有8,16,25,26
            // or “想要咨询的问题是”有内容：第一类结果（简称1）
            // 条件2：20<=总分<=24 or第61,62,63选有,多于一个（>=1）or 第8,16,26选是：第二类结果（简称2）
            // Else：第三类结果(简称3)
            System.out.println(blExist);
            if (vFactor >= 25 || Integer.valueOf(sAnswer[24]) == 2 || intCount >= 2 || blExist == true
                    || strAnswer_c[2].length() > 0) {
                vAppraiseA[0] = "第一类结果：有明显的心理问题，请尽快到咨询机构面谈！";
            } else if (vFactor >= 20 || intCount >= 1 || Integer.valueOf(sAnswer[7]) == 2
                    || Integer.valueOf(sAnswer[15]) == 2 || Integer.valueOf(sAnswer[25]) == 2) {
                vAppraiseA[0] = "第二类结果：可能有心理问题，应该引起关注！";
            } else {
                vAppraiseA[0] = "第三类结果：心理健康！";
            }

            // 1（题25选是）：第二十五题做肯定回答：想轻生。
            // 2（题8选是）：第八题做肯定回答：自己的过去和家庭是不幸的。
            // 2（题16选是）：第十六题做肯定回答：常常失眠。
            // 2（题26选是）：第二十六题做肯定回答：对任何事情都没有兴趣。
            // 1，2（题61选有）：辅助题第一题做肯定回答：至今为止，感到在自身健康方面有问题。
            // 1，2（题62选有）：辅助题第二题做肯定回答：曾经觉得心理卫生方面有问题。
            // 1，2（题63选有）：辅助题第三题做肯定回答：至今为止，曾经接受过心理卫生的咨询和治疗。
            int[] intNumA = { 25, 8, 16, 26, 61, 62, 63 };
            String[] strValueA = { "第二十五题做肯定回答：想轻生。", "第八题做肯定回答：自己的过去和家庭是不幸的。", "第十六题做肯定回答：常常失眠。",
                    "第二十六题做肯定回答：对任何事情都没有兴趣。", "辅助题第一题做肯定回答：至今为止，感到在自身健康方面有问题。", "辅助题第二题做肯定回答：曾经觉得心理卫生方面有问题。",
                    "辅助题第三题做肯定回答：至今为止，曾经接受过心理卫生的咨询和治疗。" };
            for (i = 0; i < intNumA.length; i++) {
                if (Integer.valueOf(sAnswer[intNumA[i] - 1]) == 2) {
                    vAppraiseA[i + 1] = strValueA[i];
                }
            }

            ClsScore.Upi upi = new ClsScore.Upi();

            upi.setTotal_o(vFactor);
            upi.setTotal_a1(vAppraiseA[0]);
            upi.setTotal_a2(vAppraiseA[1]);
            upi.setTotal_a3(vAppraiseA[2]);
            upi.setTotal_a4(vAppraiseA[3]);
            upi.setTotal_a5(vAppraiseA[4]);
            upi.setTotal_a6(vAppraiseA[5]);
            upi.setTotal_a7(vAppraiseA[6]);
            upi.setTotal_a8(vAppraiseA[7]);

            result.setObject(upi);
            return result;
        } catch (ArithmeticException e) {
            result.setMessage(e.toString());
            return result;
        }
    }

}
